package com.zyx.xml.dom;

import javax.xml.parsers.*;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import org.w3c.dom.*;

/**
 * Description:
 * <br/>10.2.5 使用DOM解析XML文档
 *
 * @author Yaxi.Zhang
 * @since 2022/9/25 09:59
 */
public class DomParse {

    public static void main(String[] args) throws Exception {
        // DOM解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setIgnoringElementContentWhitespace(true);
        // 获取DOM解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 解析XML文档，并获取该XML文档对应的Document
        Document doc = builder.parse(new ClassPathResource("ch10_02/book-list.xml").getFile());
		/*
            我们在JavaScript中编程时的document也是Document类的实例，
            因为XML文档的元素通常没有ID属性，
            否则也可通过getElementById()方法来访问各元素。
		*/
        //获得根节点的方法，getDocumentElement
        Element bookList = doc.getDocumentElement();
        // 获取根元素所包含的所有“计算机书籍”子元素，
        // 如果传入*作为参数，可获取所有子元素
        NodeList nodeList = bookList.getElementsByTagName("计算机书籍");
        // 遍历每个子元素
        for (int i = 0; i < nodeList.getLength(); i++) {
            System.out.println("------------第" + i + "本计算机书籍--------------");

            Node comBook = nodeList.item(i);
            //获取ISBN属性节点
            Node isbnAttr = comBook.getAttributes().getNamedItem("ISBN");
            if (isbnAttr != null) {
                System.out.println("该图书的ISBN为：" + isbnAttr.getTextContent());
            }
            //获取所有comBook下的所有子元素
            NodeList attList = comBook.getChildNodes();
            //遍历每个子元素
            for (int j = 0; j < attList.getLength(); j++) {
                System.out.println(attList.item(j).getTextContent().trim());
            }
        }
        // 获取根元素所包含的所有“文学书籍”子元素，
        nodeList = bookList.getElementsByTagName("文学书籍");
        // 遍历每个子元素
        for (int i = 0; i < nodeList.getLength(); i++) {
            System.out.println("------------第" + i + "本文学书籍--------------");
            Node cultureBook = nodeList.item(i);
            System.out.println(cultureBook.getTextContent());
        }
        // 获取根元素所包含的所有“哲学书籍”子元素，
        nodeList = bookList.getElementsByTagName("哲学书籍");
        // 遍历每个子元素
        for (int i = 0; i < nodeList.getLength(); i++) {
            System.out.println("------------第" + i + "本哲学书籍--------------");
            Node cultureBook = nodeList.item(i);
            System.out.println(cultureBook.getTextContent().trim());
            System.out.println(cultureBook.getFirstChild().getTextContent().trim());
        }
    }
}
